package com.tssup.fesco.common.utils;

import java.security.MessageDigest;
import java.util.Random;

import org.apache.commons.codec.digest.DigestUtils;


public class Encript {
	// 十六进制下数字到字符的映射数组
	private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5",
			"6", "7", "8", "9", "A", "B", "C", "D", "E", "F" };

	private final static String SECRET_KEY = "123456";

	/** 把inputString加密 */
	public static String md5(String inputStr) {
		return encodeByMD5(inputStr);
	}

	/**
	 * 验证输入的密码是否正确
	 * 
	 * @param password
	 *            真正的密码（加密后的真密码）
	 * @param inputString
	 *            输入的字符串
	 * @return 验证结果，boolean类型
	 */
	public static boolean authenticatePassword(String password,
			String inputString) {
		if (password.equals(encodeByMD5(inputString))) {
			return true;
		} else {
			return false;
		}
	}

	/** 对字符串进行MD5编码 */
	private static String encodeByMD5(String originString) {
		if (originString != null) {
			try {
				// 创建具有指定算法名称的信息摘要
				MessageDigest md5 = MessageDigest.getInstance("MD5");
				// 使用指定的字节数组对摘要进行最后更新，然后完成摘要计算
				byte[] results = md5.digest(originString.getBytes());
				// 将得到的字节数组变成字符串返回
				String result = byteArrayToHexString(results);
				return result;
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return null;
	}

	/**
	 * 轮换字节数组为十六进制字符串
	 * 
	 * @param b
	 *            字节数组
	 * @return 十六进制字符串
	 */
	private static String byteArrayToHexString(byte[] b) {
		StringBuilder resultSb = new StringBuilder();
		for (int i = 0; i < b.length; i++) {
			resultSb.append(byteToHexString(b[i]));
		}
		return resultSb.toString();
	}

	// 将一个字节转化成十六进制形式的字符串
	private static String byteToHexString(byte b) {
		int n = b;
		if (n < 0) {
			n = 256 + n;
		}
		int d1 = n / 16;
		int d2 = n % 16;
		return hexDigits[d1] + hexDigits[d2];
	}

	public static String sha1String(String password, String salt) {
		String data = password + SECRET_KEY + salt;
		return DigestUtils.sha256Hex(data);
	}
	
	public static boolean isright(String password, String dbPwd, String salt) {
		return sha1String(password, salt).equals(dbPwd);
	}
	
	public static String randomString(int len) {
		Random rand = new Random(System.nanoTime());
		StringBuilder sb = new StringBuilder();
		for (;;) {
			int n = rand.nextInt(27);
			if (sb.length() == len) {
				break;
			}
			sb.append((char) ('`' + n));
		}
		return sb.toString();
	}

	public synchronized static String generate() {
        return getRandomSalt(8);
    }
	
	public static String getRandomSalt(final int num) {
        final StringBuilder saltString = new StringBuilder();
        for (int i = 1; i <= num; i++) {
            saltString.append(new Random().nextInt(10));
        }
        return saltString.toString();
    }
	
}

